package com.kh.rationaldrugreview.mapper;

import com.kh.rationaldrugreview.entity.EntityAlias;
import com.kh.rationaldrugreview.entity.EntityRelationship;
import com.kh.rationaldrugreview.entity.KnowledgeEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 知识实体数据访问接口
 */
@Mapper
public interface KnowledgeEntityMapper {
    
    /**
     * 根据实体类型和标准化名称查找实体
     * @param entityType 实体类型
     * @param canonicalName 标准化名称
     * @return 知识实体
     */
    KnowledgeEntity findByTypeAndCanonicalName(@Param("entityType") String entityType, 
                                               @Param("canonicalName") String canonicalName);
    
    /**
     * 根据实体类型和名称查找实体（支持原始名称和别名）
     * @param entityType 实体类型
     * @param name 名称
     * @return 知识实体
     */
    KnowledgeEntity findByTypeAndName(@Param("entityType") String entityType, 
                                     @Param("name") String name);
    
    /**
     * 根据ID查找实体
     * @param entityId 实体ID
     * @return 知识实体
     */
    KnowledgeEntity findById(@Param("entityId") Long entityId);
    
    /**
     * 根据Neo4j节点ID查找实体
     * @param neo4jNodeId Neo4j节点ID
     * @return 知识实体
     */
    KnowledgeEntity findByNeo4jNodeId(@Param("neo4jNodeId") String neo4jNodeId);
    
    /**
     * 插入新实体
     * @param entity 知识实体
     * @return 影响行数
     */
    int insert(KnowledgeEntity entity);
    
    /**
     * 更新实体
     * @param entity 知识实体
     * @return 影响行数
     */
    int update(KnowledgeEntity entity);
    
    /**
     * 更新实体频次
     * @param entityId 实体ID
     * @return 影响行数
     */
    int incrementFrequency(@Param("entityId") Long entityId);
    
    /**
     * 批量查找实体
     * @param entityIds 实体ID列表
     * @return 知识实体列表
     */
    List<KnowledgeEntity> findByIds(@Param("entityIds") List<Long> entityIds);
    
    /**
     * 根据类型查找实体
     * @param entityType 实体类型
     * @return 知识实体列表
     */
    List<KnowledgeEntity> findByType(@Param("entityType") String entityType);
    
    /**
     * 根据来源查找实体
     * @param source 来源
     * @return 知识实体列表
     */
    List<KnowledgeEntity> findBySource(@Param("source") String source);
    
    // 别名相关操作
    
    /**
     * 根据别名查找实体
     * @param aliasName 别名
     * @return 知识实体
     */
    KnowledgeEntity findByAlias(@Param("aliasName") String aliasName);
    
    /**
     * 插入别名
     * @param alias 实体别名
     * @return 影响行数
     */
    int insertAlias(EntityAlias alias);
    
    /**
     * 查找实体的所有别名
     * @param entityId 实体ID
     * @return 别名列表
     */
    List<EntityAlias> findAliasesByEntityId(@Param("entityId") Long entityId);
    
    /**
     * 删除别名
     * @param aliasId 别名ID
     * @return 影响行数
     */
    int deleteAlias(@Param("aliasId") Long aliasId);
    
    // 关系相关操作
    
    /**
     * 查找关系
     * @param sourceEntityId 源实体ID
     * @param targetEntityId 目标实体ID
     * @param relationshipType 关系类型
     * @return 实体关系
     */
    EntityRelationship findRelationship(@Param("sourceEntityId") Long sourceEntityId,
                                       @Param("targetEntityId") Long targetEntityId,
                                       @Param("relationshipType") String relationshipType);
    
    /**
     * 插入关系
     * @param relationship 实体关系
     * @return 影响行数
     */
    int insertRelationship(EntityRelationship relationship);
    
    /**
     * 更新关系
     * @param relationship 实体关系
     * @return 影响行数
     */
    int updateRelationship(EntityRelationship relationship);
    
    /**
     * 查找实体的所有关系
     * @param entityId 实体ID
     * @return 关系列表
     */
    List<EntityRelationship> findRelationshipsByEntityId(@Param("entityId") Long entityId);
    
    /**
     * 查找实体的出边关系
     * @param sourceEntityId 源实体ID
     * @return 关系列表
     */
    List<EntityRelationship> findOutgoingRelationships(@Param("sourceEntityId") Long sourceEntityId);
    
    /**
     * 查找实体的入边关系
     * @param targetEntityId 目标实体ID
     * @return 关系列表
     */
    List<EntityRelationship> findIncomingRelationships(@Param("targetEntityId") Long targetEntityId);
    
    /**
     * 统计实体总数
     * @return 实体总数
     */
    int countEntities();
    
    /**
     * 统计关系总数
     * @return 关系总数
     */
    int countRelationships();
}